package org.tp;

import java.util.*;
import org.tp.*;

/** Variable locale, liste d'hashmap de string et de variable**/
public class VarLocImp {
	List <HashMap<String,Variable>> current;

	public  VarLocImp(){
		current=new LinkedList<HashMap<String,Variable>>();
	}
/** ajout d'une hashmap en tete de liste**/
	public void newEnv(){
		//System.out.println("ADD ENV\n");
		HashMap tmp= new HashMap<String,Variable>();
		current.add(0,tmp); // On Ajoute en tete
	}
/**affiche l'environnement courant, la tete de file**/
	public void afficher_Current(){
		//System.out.println("AFFICHER CURRENT\n");
		/*PARSE ERROR*/
		HashMap<String,Variable> HM = new HashMap<String, Variable>();
		HM = current.get(0);
		for(Object i : HM.keySet())
		{
			HM.get(i).varToString();
		}	
	}

/** efface l'environnement la tete de file**/
	public void deleteCurrent(){
		//System.out.println("DELETE ENV\n");
		current.remove(0);//on supprime en tete
	}


/**affiche les variables locale**/
	public void varLocToString()
	{
		HashMap<String,Variable> hm=new HashMap<String,Variable>();
		hm=current.get(0);
		for(String i : hm.keySet() )
		{
			System.out.println(hm.get(i).toString() +"\n");
		}
	}
/** ajour d'une variable dans l'environnement courrant sans valeur**/
	public void addVar(String id, Type type){
		//System.out.println("ADD VAR\n");
		current.get(0).put(id,new Variable(id, type,0));
	}
/** ajour d'une variable dans l'environnement courrant avec valeur**/

	public void addVar(String id, Type type, Object value){
		//System.out.println("ADD VAR\n");
		current.get(0).put(id,new Variable(id, type,value));
	}
	/*GERER ARGUMENT*/
/** ajour de variable avec un arbre syntaxique**/
	public void addVar(Object Ab){
		//System.out.println("AJOUT VARLOC ABSYNT");
		if(Ab==null){
			//System.out.println("NULL FIN VARLOC ABSYNT");
			return;
		}
		HashMap<String,Variable> args=new HashMap<String,Variable>();
		((AbSynt)Ab).getIdEtTypeArgs(args);
		if(args.isEmpty()){	
			//System.out.println(" NULL FIN VARLOC ABSYNT");
			return;
		}
		for(String id : args.keySet()){
			//System.out.println(" AJOUT");
			current.get(0).put(id,args.get(id));
		}
		//System.out.println("FIN VARLOC ABSYNT");

	}
	/**retourne si la variable id est declarer dans un environnement**/
	public boolean  Contains_var(String id){
		for(HashMap<String,Variable> i: current){ //parcours de toutes les elements de la liste.
			if(i.containsKey(id))
				return true;	
		}
		return false;
	}
/** retourne le type de la variable id et null sinon**/
	public Type  getTypeOf(String id){
		if(id.equals("this")){
			return new Type(EnumType.THIS);
		}
		for(HashMap<String,Variable> i: current){ //parcours de toutes les elements de la liste.
			if(i.get(id)!=null)
				return i.get(id).getType();	
		}
		return null;
	}



}


